/**
 * @ClassName LC42
 * 接雨水
 * 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图，计算按此排列的柱子，下雨之后能接多少雨水。
 * @Author ykx
 * @Date 2024/3/2 15:22
 * @Version 1.0
 */
public class LC42 {
    public int trap(int[] height) {
        // 总雨水量
        int trap = 0;
        int left = 0;

        // 以左边为基准，装水
        for (int i = 1; i < height.length; i++) {
            if (height[i] < height[left]) {
                continue;
            } else {
                if (i - left > 1) {
                    trap += height[left] * (i - left - 1);
                    for (int j = left + 1; j < i; j++) {
                        trap -= height[j];
                    }
                }
                left = i;
            }
        }

        // 此时left已经成为最高柱子
        int right = height.length - 1;

        // 以右边为基准，装水
        for (int i = right - 1; i >= left; i--) {
            if (height[i] > height[right]) {
                continue;
            } else {
                if (right - i > 1) {
                    trap += height[i] * (right - i - 1);
                    for (int j = i + 1; j < right; j++) {
                        trap -= height[j];
                    }
                }
            }
            right = i;
        }

        return trap;
    }
}
